home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / comms / www / urlx / scanv.c < prev    next >
C/C++ Source or Header  |  1999-09-06  |  3KB  |  133 lines

  1. /*
  2.  *  scanv - scan voyager cache directory
  3.  */
  4.  
  5. #include <sys/types.h>
  6. #include <sys/dir.h>
  7. #include <sys/stat.h>
  8.  
  9. #include <stdio.h>
  10.  
  11. #define getl_be(a) \
  12.   (  ((u_long)(((u_char *)(a))[3]))   \
  13.    + ((u_long)(((u_char *)(a))[2]) << 8) \
  14.    + ((u_long)(((u_char *)(a))[1]) << 16) \
  15.    + ((u_long)(((u_char *)(a))[0]) << 24))
  16.  
  17. #define getw_be(a) \
  18.   (  ((u_long)(((u_char *)(a))[1]))   \
  19.    + ((u_long)(((u_char *)(a))[0]) << 8))
  20.  
  21. char buf[1024];
  22. char url[1024];
  23.  
  24. struct stat st;
  25.  
  26. void scan_dir(char *path, int pathlen)
  27. {
  28.   DIR *dir;
  29.   struct direct *dirent;
  30.   int oldpathlen;
  31.   int is_voyager_dir = 0;
  32.  
  33.   oldpathlen = pathlen;
  34.  
  35.   if (!(dir = opendir(path)))
  36.   {
  37.     printf("couldn't open directory '%s'\n", path);
  38.     return;
  39.   }
  40.  
  41.   if (pathlen >= 6 && strnicmp(path + pathlen - 6, "CIX", 3) == 0)
  42.     is_voyager_dir = 1;
  43.  
  44. #ifdef amigaos
  45.   if (pathlen && path[pathlen - 1] != ':' && path[pathlen - 1] != '/')
  46. #endif
  47.   path[pathlen++] = '/';
  48.  
  49.   while (dirent = readdir(dir))
  50.   {
  51.     memcpy(path + pathlen, dirent->d_name, dirent->d_namlen);
  52.     path[pathlen + dirent->d_namlen] = 0;
  53.  
  54.     if (stat(path, &st) == 0)
  55.     {
  56.       if ((st.st_mode & S_IFMT) == S_IFDIR)
  57.       {
  58.         scan_dir(path, pathlen + dirent->d_namlen);
  59.       }
  60.       else
  61.       {
  62.         /*
  63.          *  file ops go here
  64.          */
  65.  
  66.         if (!is_voyager_dir)
  67.           continue;
  68.  
  69.         /*
  70.          *  open each file in turn and read url from header
  71.          */
  72.         {
  73.           FILE *fp = 0;
  74.  
  75.           if (fp = fopen(path, "rb"))
  76.           {
  77.             char temp[32];
  78.             int  size, typelen, urllen;
  79.  
  80.             /*
  81.              *  offsets
  82.              *    4.l   real size
  83.              *    8.w   length of type description (follows url)
  84.              *   10.w   length of url
  85.              *  140...  url
  86.              */
  87.             fread(temp, 16, 1, fp);
  88.  
  89.             size    = getl_be(temp + 4);
  90.             typelen = getw_be(temp + 8);
  91.             urllen  = getw_be(temp + 10);
  92.  
  93.             fseek(fp, 140, 0);
  94.  
  95.             fread(url, urllen, 1, fp);
  96.  
  97.             url[urllen] = 0;
  98.  
  99.             fclose(fp);
  100.  
  101.             printf("%s\n", url);
  102.           }
  103.         }
  104.       }
  105.     }
  106.     else
  107.       printf("no stat for %s\n", path);
  108.   }
  109.  
  110.   path[oldpathlen] = 0;
  111.  
  112.   closedir(dir);
  113.  
  114.   /*
  115.    *  directory ops would go here
  116.    */
  117. }
  118.  
  119. main(int argc, char **argv)
  120. {
  121.   if (argc < 2)
  122.   {
  123.     printf("usage: scanv <voyagercachedirectoryname>\n");
  124.     exit(0);
  125.   }
  126.  
  127.   strcpy(buf, argv[1]);
  128.  
  129.   scan_dir(buf, strlen(buf));
  130.  
  131.   return (0);
  132. }
  133.